﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using QLVBDQ.UIControl;
using BUS;
using DTO;

namespace QLVBDQ
{
    /// <summary>
    /// Interaction logic for LapPhieuBanHang.xaml
    /// </summary>
    public partial class LapPhieuBanHang : UserControl
    {
        private string maLoaiSP = string.Empty;
        public LapPhieuBanHang()
        {
            InitializeComponent();
        }

        private void HoaDonMoi_Click(object sender, RoutedEventArgs e)
        {
            XoaHoaDon();
        }

        private void ThemSP_Click(object sender, RoutedEventArgs e)
        {
            ThemSanPham();
        }

        private void XoaSP_Click(object sender, RoutedEventArgs e)
        {
            XoaSanPham();
        }

        private void XuatHoaDon_Click(object sender, RoutedEventArgs e)
        {
            XuatPhieuBanHang();
        }

        private void Thoat_Click(object sender, RoutedEventArgs e)
        {

        }

        private void listSanPham_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {

        }



        /// <summary>
        /// Load ma phieu luc khoi tao
        /// </summary>
        void LoadMaPhieu()
        {
            maPhieu.Text = PhieuBanHang_BUS.Instance.LayMaPhieuBanHangMax();
        }

        /// <summary>
        /// Lấy ngày giờ mặc định
        /// </summary>
        void SetNgayMacDinh()
        {
            ngayBan.DisplayDate = DateTime.Now;
            ngayBan.SelectedDate = DateTime.Now;

            ngayThanhtoan.DisplayDate = DateTime.Now;
            ngayThanhtoan.SelectedDate = DateTime.Now;
        }

        /// <summary>
        /// Khởi tạo Tự động điền cho Mã Khách Hàng
        /// </summary>
        void KhoiTaoMaKhachHangAuto()
        {
            List<string> list = KhachHang_BUS.Instance.LayToanBoMaKhachHang();
            for (int i = 0; i < list.Count; i++)
                maKhachHang.AddItem(new AutoCompleteEntry(list[i], list[i]));
        }

        /// <summary>
        /// Bắt sự kiện
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void maKhachHang_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Tab)
            {
                e.Handled = true;
                maSP.MakeFocus();
            }
        }

        /// <summary>
        /// Tự động điền thông tin khách hàng khi biết mã khách hàng
        /// </summary>
        void TuDongDienThongTinKhachHang()
        {
            KhachHang_DTO kh = KhachHang_BUS.Instance.LayThongTinKhachHang(maKhachHang.Text);
            if (kh == null)
            {
                hoTen.Text = string.Empty;
                diaChi.Text = string.Empty;
                return;
            }
            hoTen.Text = kh.TenKhachHang;
            diaChi.Text = kh.DiaChi;
            loaiThanhToan.Items.Clear();
            if (kh.ThanThiet)
            {
                ComboBoxItem item = new ComboBoxItem();
                item.Content = "Thanh toán liền";
                ComboBoxItem item2 = new ComboBoxItem();
                item2.Content = "Thanh toán trả sau";

                loaiThanhToan.Items.Add(item);
                loaiThanhToan.Items.Add(item2);

                loaiThanhToan.Items.Refresh();
            }
            else
            {
                ComboBoxItem item = new ComboBoxItem();
                item.Content = "Thanh toán liền";
                loaiThanhToan.Items.Add(item);
                
                loaiThanhToan.Items.Refresh();
            }
            loaiThanhToan.SelectedIndex = 0;
        }

        /// <summary>
        /// Khởi tạo tự động điền cho mã sản phẩm
        /// </summary>
        void KhoiTaoMaSanPhamAuto()
        {
            List<string> list = SanPham_BUS.Instance.LayToanBoMaSanPham();
            for (int i = 0; i < list.Count; i++)
                maSP.AddItem(new AutoCompleteEntry(list[i], list[i]));
        }

        /// <summary>
        /// Tự động điền thông tin sản phẩm
        /// </summary>
        void TuDongDienThongTinSanPham()
        {
            SanPham_DTO sp = SanPham_BUS.Instance.LayThongTinSanPham(maSP.Text);
            if (sp == null)
            {
                tenSP.Text = string.Empty;
                loaiSanPham.Text = string.Empty;
                soLuongTon.Text = string.Empty;
                donGiaBan.Text = string.Empty;
                maLoaiSP = string.Empty;
                return;
            }
            tenSP.Text = sp.TenSanPham;
            loaiSanPham.Text = sp.LoaiSP.TenLoaiSanPham;
            soLuongTon.Text = sp.SoLuongTon.ToString();
            donGiaBan.Text = sp.DonGia.ToString();
            maLoaiSP = sp.LoaiSP.MaLoaiSanPham;
        }

        /// <summary>
        /// Bắt sự kiện tab cho Mã SP
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void maSP_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Tab)
            {
                e.Handled = true;
                soLuongMua.Focus();
            }
        }

        /// <summary>
        /// Thêm sản phẩm vào list
        /// </summary>
        private void ThemSanPham()
        {
            // Kiem tra
            if (maSP.Text == String.Empty)
            {
                MessageBox.Show("Bạn phải điền thông tin về sãn phẩm");
                return;
            }
            if (soLuongMua.Text == string.Empty)
            {
                MessageBox.Show("Bạn phải điền thông tin về số lượng mua");
                return;
            }
            try
            {
                if (Int32.Parse(soLuongMua.Text) > Int32.Parse(soLuongTon.Text))
                {
                    MessageBox.Show("Số lượng mua không được lớn hơn Số lượng tồn");
                    return;
                }
            }
            catch (FormatException e)
            {
                MessageBox.Show("Số lượng mua phải là chữ số!");
            }

            // Thêm vào list
            SanPham_DTO sp = new SanPham_DTO(maSP.Text, tenSP.Text, maLoaiSP, loaiSanPham.Text, long.Parse(donGiaBan.Text), Int32.Parse(soLuongMua.Text));
            sp.STT = listSanPham.Items.Count + 1;
            sp.ThanhTien = sp.SoLuongTon * sp.DonGia;
            listSanPham.Items.Add(sp);
            listSanPham.Items.Refresh();
            
            // Cho nó về empty
            tenSP.Text = string.Empty;
            loaiSanPham.Text = string.Empty;
            soLuongTon.Text = string.Empty;
            donGiaBan.Text = string.Empty;
            maLoaiSP = string.Empty;
            maSP.Text = string.Empty;
            soLuongMua.Text = string.Empty;
            TinhTongTien();
            
            MessageBox.Show("Thêm sản phẩm thành công!");
            maSP.MakeFocus();
        }

        /// <summary>
        /// Hàm xóa sản phẩm trong list
        /// </summary>
        void XoaSanPham()
        {
            // Kiểm tra xóa sản phẩm
            if (listSanPham.SelectedIndex == -1)
            {
                MessageBox.Show("Bạn phải chọn sản phẩm để xóa");
                return;
            }

            // XÓa ngay và luôn
            listSanPham.Items.Remove(listSanPham.SelectedItem);
            TinhTongTien();
            MessageBox.Show("Xóa thành công");
        }

        /// <summary>
        /// Lập hóa đơn mới
        /// </summary>
        void XoaHoaDon()
        {
            // Xác nhận
            if (MessageBox.Show("Có chắc bạn muốn xóa!", "Cảnh báo", MessageBoxButton.YesNo) == MessageBoxResult.No)
                return;

            listSanPham.Items.Clear();
            listSanPham.Items.Refresh();

            // Xóa sp
            tenSP.Text = string.Empty;
            loaiSanPham.Text = string.Empty;
            soLuongTon.Text = string.Empty;
            donGiaBan.Text = string.Empty;
            maLoaiSP = string.Empty;
            maSP.Text = string.Empty;
            soLuongMua.Text = string.Empty;

            // Xóa khách hàng
            maKhachHang.Text = string.Empty;
            hoTen.Text = string.Empty;
            diaChi.Text = string.Empty;

            tongTien.Text = "0";

            LoadMaPhieu();
        }

        /// <summary>
        /// Lưu phiếu bán hàng và chi tiết phiếu bán hàng vào csdl
        /// </summary>
        void XuatPhieuBanHang()
        {
            // Xác nhận
            if (MessageBox.Show("Có chắc bạn muốn xuất phiếu!", "Cảnh báo", MessageBoxButton.YesNo) == MessageBoxResult.No)
                return;

            if (hoTen.Text == string.Empty)
            {
                MessageBox.Show("Sai thông tin khách hàng!");
                return;
            }

            if (listSanPham.Items.Count == 0)
            {
                MessageBox.Show("Phải có ít nhất 1 sản phẩm được mua!");
                return;
            }
            
            // Thêm phiếu bán hàng
            long tongTien = 0;
            for (int i = 0; i < listSanPham.Items.Count; i++)
                tongTien += ((SanPham_DTO)listSanPham.Items[i]).ThanhTien;

            // Thêm phiếu bán hàng
            DateTime ngBan = ngayBan.SelectedDate.Value;
            DateTime ngTt = ngayThanhtoan.SelectedDate.Value;
            if (!PhieuBanHang_BUS.Instance.ThemPhieuBanHangMoi(new PhieuBanHang_DTO("---", ngBan.Day, ngBan.Month, ngBan.Year,
                ngTt.Day, ngTt.Month, ngTt.Year, maKhachHang.Text, tongTien)))
            {
                MessageBox.Show("Them phiếu ko thành công");
                return;
            }

            // Thêm chi tiết phiếu bán hàng
            for (int i = 0; i < listSanPham.Items.Count; i++)
            {
                SanPham_DTO sp = (SanPham_DTO)listSanPham.Items[i];
                ChiTietPhieuBanHang_DTO phieu = new ChiTietPhieuBanHang_DTO("---", maPhieu.Text, sp.MaSanPham, sp.SoLuongTon, sp.DonGia);
                ChiTietPhieuBanHang_BUS.Instance.ThemChiTietPhieuBanHang(phieu);
                // Cập nhật lại số lượng tồn
                SanPham_DTO spCu = SanPham_BUS.Instance.LayThongTinSanPham(sp.MaSanPham);
                spCu.SoLuongTon = spCu.SoLuongTon - sp.SoLuongTon;
                if (!SanPham_BUS.Instance.CapNhatSanPham(spCu))
                {
                    MessageBox.Show("Error: Lỗi tại cập nhật số lượng tồn sản phẩm");
                }
            }

            // Thêm phiếu nợ (nếu có)
            if (loaiThanhToan.SelectedIndex == 1)
            {
                if (!PhieuNo_BUS.Instance.ThemPhieuNoMoi(new PhieuNo_DTO("---", maPhieu.Text, ngayBan.SelectedDate.Value, ngayThanhtoan.SelectedDate.Value, tongTien, 0, tongTien)))
                {
                    MessageBox.Show("Error: Không thể tạo phiếu nợ!");
                }
            }

            MessageBox.Show("Thêm phiếu bán hàng thành công!");
        }

        /// <summary>
        /// Tính tổng tiền và cập nhật vào textbox
        /// </summary>
        private void TinhTongTien()
        {
            // Tinh tong tien
            long tongtien = 0;
            for (int i = 0; i < listSanPham.Items.Count; i++)
                tongtien += ((SanPham_DTO)listSanPham.Items[i]).ThanhTien;
            tongTien.Text = tongtien.ToString();
        }

        private void maKhachHang_LostFocus(object sender, RoutedEventArgs e)
        {
            if (maKhachHang.IsElementFocused())
                return;
            TuDongDienThongTinKhachHang();
        }

        private void maSP_LostFocus(object sender, RoutedEventArgs e)
        {
            if (maSP.IsElementFocused())
                return;
            TuDongDienThongTinSanPham();
        }

        private void UserControl_Loaded_1(object sender, EventArgs e)
        {
            LoadMaPhieu();
            SetNgayMacDinh();
            KhoiTaoMaKhachHangAuto();
            KhoiTaoMaSanPhamAuto();
            maKhachHang.MakeFocus();
        }


    }
}
